package ntd.util.frame.action.database.tool;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Opt;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.Entity;
import cn.hutool.db.Page;
import cn.hutool.db.sql.Direction;
import cn.hutool.db.sql.Order;
import cn.hutool.json.JSONUtil;
import ntd.util.config.common.enums.EnumDataRule;
import ntd.util.frame.data.bo.MetaTableField;
import ntd.util.frame.data.bo.QueryRuleInfo;
import ntd.util.frame.data.factory.FactoryData;
import ntd.util.frame.data.tool.ToolMysql;

import javax.sql.DataSource;
import java.util.List;

public class ToolDb {

    /**
     * 根据数据规则构建查询entity对象
     * @param where
     * @param enumDataRule
     * @param col
     * @param val
     */
    public static void entityBuild(Entity where, EnumDataRule enumDataRule, String col, Object val) {
        switch (enumDataRule) {
            case RULE_EQ: where.set(col, val); break;
            case RULE_GE: where.set(col, StrUtil.format(">= {}", val)); break;
            case RULE_GT: where.set(col, StrUtil.format("> {}", val)); break;
            case RULE_LE: where.set(col, StrUtil.format("<= {}", val)); break;
            case RULE_LT: where.set(col, StrUtil.format("< {}", val)); break;
            case RULE_NE: where.set(col, StrUtil.format("!= {}", val)); break;
            case RULE_NE_NULL: where.set(col, StrUtil.format("is not null")); break;
            case RULE_MAX: where.set(EnumDataRule.RULE_MAX.name(), col); break;
            case RULE_MIN: where.set(EnumDataRule.RULE_MIN.name(), col); break;
            default: ;
        }
    }

    /**
     * 将entity对象字符串根据类型自动转换方法
     * @param entity
     */
    public static void fieldTransform(Entity entity) {
        Opt.ofNullable(entity).ifPresent(item -> {
            for (String fieldName : item.getFieldNames()) {
                String val = item.getStr(fieldName);
                if (JSONUtil.isTypeJSON(val)) {
                    item.set(fieldName, JSONUtil.parse(val));
                }
//                if (NumberUtil.isNumber(val)) {
//                    item.set(fieldName, NumberUtil.parseNumber(val));
//                }
            }
        });
    }

    public static String pageSql(int page, int size) {
        return StrUtil.format("limit {},{}", (page) * size, size);
    }

}
